package com.okbihuo.perm.core.mp.base;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService;
import com.okbihuo.perm.core.mp.exception.DataUpdateException;
import com.okbihuo.perm.core.mp.utils.QueryHelper;
import com.okbihuo.perm.core.tool.api.BaseException;

import java.util.Collection;
import java.util.List;

public interface MyService<T> extends IService<T> {

    /**
     * 查询复杂查询定义对象
     * @see Wrappers#emptyWrapper()
     */
    default List<T> list(MyQueryCriteria<T> queryCriteria) {
        return list(QueryHelper.getQueryWrapper(queryCriteria));
    }

    /**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param criteria 复杂查询定义对象
     */
    default <E extends IPage<T>> E page(E page, MyQueryCriteria<T> criteria) {
        QueryWrapper<T> queryWrapper = QueryHelper.getQueryWrapper(criteria);
        return getBaseMapper().selectPage(page, queryWrapper);
    }



    /**
     * 保存或更新后，失败抛出错误, 成功则返回对象
     * @param t 更新实体
     * @return 更新后的实体
     * @throws BaseException 更新失败
     */
    default T saveOrUpdateAndReturn(T t) throws DataUpdateException {
        boolean result = this.saveOrUpdate(t);
        if(result) {
            return t;
        }
        throw new DataUpdateException("保存失败");
    }

    /**
     * 批量保存或更新后，失败抛出错误
     * @throws BaseException 更新失败
     */
    default void saveOrUpdateBatchAndThrow(Collection<T> entityList) throws DataUpdateException {
        boolean b = saveOrUpdateBatch(entityList);
        if(!b) {
            throw new DataUpdateException("保存失败");
        }
    }

    /**
     * 更新单个字段
     * @param id 实体id
     * @param field 字段名
     * @param value 值
     * @return 更新后的实体
     * @throws BaseException 更新失败
     */
    default T update(Integer id, String field, Object value) throws DataUpdateException {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id);
        updateWrapper.set(field, value);
        boolean result = update(updateWrapper);
        if(!result) {
            throw new DataUpdateException(String.format("字段[%s]更新失败", field));
        }
        return getOne(updateWrapper);
    }

    /**
     * 删除，删除失败时抛出错误
     * @param id 实体id
     * @throws BaseException 删除失败
     */
    default void delete(Integer id) throws DataUpdateException {
        boolean b = removeById(id);
        if(!b) {
            throw new DataUpdateException("删除失败");
        }
    }

}
